//package com.zj.service;
//
//import jakarta.annotation.PostConstruct;
//import lombok.extern.java.Log;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.core.io.ClassPathResource;
//import org.springframework.data.redis.core.StringRedisTemplate;
//import org.springframework.data.redis.core.script.DefaultRedisScript;
//import org.springframework.jms.core.JmsTemplate;
//import org.springframework.stereotype.Service;
//
//import java.util.Arrays;
///**
// * @author zj
// * @description 抢红包服务实现类
// * @date 2024-08-20
// */
//@Service
//@Log
//public class GrabRedPacketService {
//    @Autowired
//    private StringRedisTemplate redisTemplate;
//
//    @Autowired
//    private JmsTemplate jmsTemplate;  // ActiveMQ消息模板
//
//    @Value("${app.activemq.queue-name}")
//    private String queueName;
//
//    private DefaultRedisScript<String> grabRedPacketScript;
//
//    /**
//     * 初始化方法：加载Lua脚本
//     * 功能：在Bean创建后自动执行，预加载Lua脚本到Redis
//     */
//    @PostConstruct
//    public void init() {
//        grabRedPacketScript = new DefaultRedisScript<>();
//        grabRedPacketScript.setLocation(new ClassPathResource("scripts/grab_red_packet.lua"));
//        grabRedPacketScript.setResultType(String.class);  // 设置返回类型为字符串
//    }
//
//    /**
//     * 抢红包核心方法
//     * 功能：执行抢红包逻辑，包括防重校验、库存扣减、消息发送
//     */
//    public int grabRedPacket(String redPacketId, Long userId) {
//        // 构造Redis键
//        String stockKey = "redpacket:" + redPacketId + ":stock";
//        String amountListKey = "redpacket:" + redPacketId + ":amount_list";
//        String grabedUsersKey = "redpacket:" + redPacketId + ":grabed_users";
//
//        // 执行Lua脚本（原子性操作）
//        String result = redisTemplate.execute(
//                grabRedPacketScript,
//                Arrays.asList(stockKey, amountListKey, grabedUsersKey, userId.toString())
//        );
//
//        // 处理Lua脚本返回结果
//        if (result == null) {
//            log.warning("红包不存在: redPacketId={"+redPacketId+"}, userId={"+userId+"}");
//            return -1;  // 红包不存在
//        }
//        if ("0".equals(result)) {
//            log.info("抢红包失败: redPacketId={"+redPacketId+"}, userId={"+userId+"}");
//            return -1;  // 抢失败（库存不足或已抢过）
//        }
//
//        // 抢红包成功：解析金额
//        int amount = Integer.parseInt(result);
//        log.info("抢红包成功: userId={"+userId+"}, redPacketId={"+redPacketId+"}, amount={"+amount+"分}");
//
////        // 发送消息到ActiveMQ（异步落库）
////        sendToActiveMQ(userId, redPacketId, amount);
//
//        return amount;
//    }
//
////    /**
////     * 发送消息到ActiveMQ
////     * 功能：将抢红包成功记录异步发送到消息队列
////     */
////    private void sendToActiveMQ(Long userId, String redPacketId, int amount) {
////        try {
////            RedPacketMessage message = new RedPacketMessage(userId, redPacketId, amount, new Date());
////
////            jmsTemplate.convertAndSend(queueName, message, new MessagePostProcessor() {
////                @Override
////                public Message postProcessMessage(Message message) throws JMSException {
////                    // 设置消息属性，便于监控和排查问题
////                    message.setStringProperty("messageType", "RED_PACKET_GRAB");
////                    message.setJMSTimestamp(System.currentTimeMillis());
////                    message.setStringProperty("redPacketId", redPacketId);
////                    message.setStringProperty("userId", userId.toString());
////                    return message;
////                }
////            });
////
////            log.debug("ActiveMQ消息发送成功: userId={}, amount={}", userId, amount);
////
////        } catch (Exception e) {
////            log.error("发送ActiveMQ消息失败: userId={}, redPacketId={}", userId, redPacketId, e);
////            // 这里可以添加重试机制或降级处理
////            // 例如：将失败消息存入本地文件或数据库，后续补偿处理
////        }
////    }
//}